//
//  HACCrashSavior.h
//  HACRouter
//
//  Created by Chengjie on 2019/5/25.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
/**
 Unrecognized Selector类型crash防护
 
 1、try...catch可以抓住上述NSInvalidArgumentException异常。try...catch适用于未来不可知的情况，但是对于知道可能会有问题的地方，还是需要编码时加强健壮性!
 
 2、respondsToSelector用来判断是否存在指定的方法，如果存在再调用就不会发生错误。
 
 3、NSSetUncaughtExceptionHandler机制来控制处理，对于我们没有写try...catch的代码，如果发生异常，就会被我们指定的异常Handler抓住，这个时候就可以做相关处理，比如将异常信息记日志、发送服务器或者忽略等操作。
 
 4、消息转发（Message Forward），是Objective-C语言级别的特性，即Runtime的特性，也是Objective-C动态语言的特色之一。Objective-C Runtime会提供3次挽救的机会（准确的说是1次动态方法解析+2次消息转发；其中实例方法救3次，类方法救1次）
 
 对于消息转发对于未找到方法时，我们可以创建一个桩类利用runtime动态添加对象和类方法将消息处理
 
 原理可参考：
 https://blog.csdn.net/goodluckwujie/article/details/84255814
 https://blog.csdn.net/cooldragon/article/details/52497064
 https://www.jianshu.com/p/c5bdd6f7a68c
 https://www.jianshu.com/p/d31e4a9888f9
 https://blog.csdn.net/fengsh998/article/details/8614486
 */
@interface HACCrashSavior : NSObject

/**
 动态添加一个对象方法
 */
- (BOOL)hac_addInstanceSaviorSel:(SEL)sel_;

/**
 动态添加一个类方法
 */
+ (BOOL)hac_addClassSaviorSel:(SEL)sel_;

@end

NS_ASSUME_NONNULL_END
